package com.dave.gd.core.base.repository;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.springframework.jdbc.support.rowset.SqlRowSet;

import com.dave.gd.core.base.dao.BaseDao;
import com.dave.gd.core.base.entity.impl.AbstractBaseEntity;
import com.dave.gd.core.common.pagehelper.PageInfo;

@SuppressWarnings("rawtypes")
public interface IBaseRepository<T extends AbstractBaseEntity, ID extends Serializable>
    extends BaseDao {
    public void setRepositoryClass(Class<T> clazz);
    
    public Class<T> getRepositoryClass();
    
    /**
     * 添加新实体
     */
    int insert(T t);
    
    /**
     * 删除实体
     */
    int delete(T t);
    
    /**
     * 修改实体
     */
    int update(T t);
    
    /**
     * 通过ID获取实体
     */
    T getById(ID id);
    
    /**
     * 根据框架生成查询语句，尽量少用
     */
    @Deprecated
    List<T> queryAll();
    
    /**
     * 根据框架生成查询语句，尽量少用
     */
    @Deprecated
    List<T> queryByMap(Map<String, Object> map);
    
    /**
     * 根据框架生成查询语句，尽量少用
     */
    @Deprecated
    PageInfo queryPageInfoByMap(Map<String, Object> map, int page, int pageSize);
    
    int jdbcQueryForIntByName(String name, Object... args);
    
    int jdbcQueryForIntByName(String name, Object[] args, int[] argTypes);
    
    int jdbcQueryForIntByName(String name);
    
    <E> List<E> jdbcQueryForListByName(String name, Class<E> elementType, Object... args);
    
    <E> List<E> jdbcQueryForListByName(String name, Class<E> elementType);
    
    List<Map<String, Object>> jdbcQueryForListByName(String name, Object... args);
    
    <E> List<E> jdbcQueryForListByName(String name, Object[] args, Class<E> elementType);
    
    <E> List<E> jdbcQueryForListByName(String name, Object[] args, int[] argTypes,
        Class<E> elementType);
    
    List<Map<String, Object>> jdbcQueryForListByName(String name, Object[] args, int[] argTypes);
    
    List<Map<String, Object>> jdbcQueryForListByName(String name);
    
    <E> List<E> jdbcFindListByName(String name, Class<E> elementType);
    
    <E> List<E> jdbcFindListByName(String name, Class<E> elementType, List<Object> params);
    
    int jdbcGetSizeByName(String name, List<Object> params);
    
    <E> PageInfo jdbcFindPageInfoByName(String name, Class<E> elementType, int currentPage,
        int perPageNum);
    
    <E> PageInfo jdbcFindPageInfoByName(String name, Class<E> elementType, List<Object> params,
        int currentPage, int perPageNum);
    
    long jdbcQueryForLongByName(String name, Object... args);
    
    long jdbcQueryForLongByName(String name, Object[] args, int[] argTypes);
    
    long jdbcQueryForLongByName(String name);
    
    Map<String, Object> jdbcQueryForMapByName(String name, Object... args);
    
    Map<String, Object> jdbcQueryForMapByName(String name, Object[] args, int[] argTypes);
    
    Map<String, Object> jdbcQueryForMapByName(String name);
    
    <E> E jdbcQueryForObjectByName(String name, Class<E> requiredType, Object... args);
    
    <E> E jdbcQueryForObjectByName(String name, Class<E> requiredType);
    
    <E> E jdbcQueryForObjectByName(String name, Object[] args, Class<E> requiredType);
    
    <E> E jdbcQueryForObjectByName(String name, Object[] args, int[] argTypes, Class<E> requiredType);
    
    SqlRowSet jdbcQueryForRowSetByName(String name, Object... args);
    
    SqlRowSet jdbcQueryForRowSetByName(String name, Object[] args, int[] argTypes);
    
    SqlRowSet jdbcQueryForRowSetByName(String name);
}
